<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>原型,原型链,call,apply</title>
</head>
<body>
    <div></div>
    <script>
        /*
            1.定义：原型是function对象的一个属性，它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象，
            可以继承该原型的属性和方法。原型也是对象。

            2.利用原型特点和概念，可以提取公有属性

            3.对象如何查看原型--->隐式属性__proto__

            4.对象如何查看对象的构造函数---> constructor
        */
        // Person.prototype ---> 原型
        // Person.prototype = {}  是祖先
        
        // function Person(){
        //     // this.name = '老李'
        // };
        // Person.prototype.name = '老王';
        // Person.prototype.say = function(){
        //     console.log("说话了");
        // };
        // var person = new Person();
        // console.log(person.name);//老王
        // console.log(person.say());//老王





        // Car.prototype.height = 1400;
        // Car.prototype.lang = 4900;
        // Car.prototype.carName ='BMW';
        //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
        // Car.prototype = {
        //     height:1400,
        //     lang:4900,
        //     carName:'BMW'
        // }

        // function Car(color,owner){
        //     this.owner = owner;
        //     // this.carName = 'BWM';
        //     // this.height = 1400;
        //     // this.lang = 4900;
        //     this.color = color;
        // }
        // var car = new Car('red','老王')
        // console.log(car.constructor);//Car(){}




        //proto可以被修改
        // Person.prototype.name = '老邓'
        // function Person(){
        //     // var this ={
        //     //     __proto__:Person.prototype
        //     // };
        // }
        // var obj = {
        //     name:'老李'
        // }
        // var person = new Person();
        // // person.__proto__ = obj;//proto可以被修改



        // Person.prototype.name = '老邓'
        // function Person(){
           
        // }
        // Person.prototype.name="老李"
        // Person.prototype = {
        //     name:'老李'
        // }
        // var person = new Person();
        // 在new执行完下面的属性赋值是不会添加进去的
        // Person.prototype = {
        //     name:'老张'
        // }
        // console.log(person.__proto__.name)//老李



        //原型链   Object.prototype是所有原型链上面的最终原型
        // Grand.prototype.__proto__ = Object.prototype (Object.prototype.__proto__---->null)
        // Grand.prototype.lastName = 'Deng';
        // function Grand(){
            
        // }

        // var grand = new Grand();
        // Father.prototype = grand;
        // function Father(){
        //     this.name = 'xuming';
        //     this.money = {
        //         card1:'visa'
        //     }
        // }

        // var father = new Father();

        // Son.prototype = father;
        // function Son(){
        //     this.hobbit = 'smoke';
        // }
        // var son = new Son();
        // console.log(son.lastName)//Deng 原型链会一直往上查找



        // Person.prototype = {
        //     name:'a',
        //     sayName:function(){
        //         console.log(this.name);
        //     },
        //     height:100
        // }
        // function Person(){
        //     this.name = 'b';
        //     this.eat = function(){
        //         this.height++;
        //     }
        // }
        // var person = new Person();
        // console.log(person.name)//b



        function Car(){

        }
        Car.prototype.play = function(){
            console.log('跑起来')
        }
        var car = new Car();
    </script>
</body>
</html>